use crate::Error;
use axum::extract::FromRequest;
use axum_valid::HasValidate;

/// 通过[axum::extract::Json]提取器实现自己的提取器
///
/// 可以返回自定义的数据结构和状态码
#[derive(FromRequest)]
#[from_request(via(axum::extract::Json), rejection(Error))]
pub struct Json<T>(pub T);

/// 数据校验[Valid]必须实现[HasValidate]trait
impl<T> HasValidate for Json<T> {
    type Validate = T;

    fn get_validate(&self) -> &Self::Validate {
        &self.0
    }
}

/// 简化[Valid<Json<T>>]的提取器
#[derive(Debug)]
pub struct ValidJson<T>(pub T);